// 导入依赖包
import koa from "koa";
// 导入 路由依赖包
import Router from "koa-router";
// 导入 请求体解析 依赖包
import bodyParser from "koa-bodyparser";
// 跨域 依赖包
import cors from "@koa/cors";
// 导入 sequelize、Op、DataTypes 模块
import { Sequelize, Op, DataTypes } from "sequelize";

// 创建 sequelize 实例
export const sequelize = new Sequelize({
    dialect: "sqlite",
    storage: "demo.db",
});

// 老师模型
const Teacher = sequelize.define("teacher", {
    // 姓名
    teacherName: {
        type: DataTypes.STRING,
    },
    // 年龄
    teacherAge: {
        type: DataTypes.INTEGER,
    },
    // 性别
    teacherSex: {
        type: DataTypes.STRING,
    },
    // 联系方式
    phone: {
        type: DataTypes.STRING,
    },
    // 教学班级
    className: {
        type: DataTypes.STRING,
    },
});

// 同步数据库
sequelize.sync();

// 创建 koa 实例
const app = new koa();

// 创建 路由 实例
const router = new Router();

// 使用 跨域 中间件 解决跨域问题
app.use(cors());

// 请求体解析
app.use(bodyParser());

/** =========================== */
/* 查询所有老师信息、查询含有关键字的老师 */
router.get('/teachers', async (ctx, next) => {
    // 条件变量
    let where;

    // 获取 查询的关键字
    const query = ctx.query.query;

    // 判断是否有 查询的关键字
    if (query) {
        // 条件查询
        where = {
            // 模糊查询
            [Op.or]: [
                // 姓名
                {
                    teacherName: { [Op.like]: `%${query}%` },
                },
                // 年龄
                {
                    teacherAge: { [Op.like]: `%${query}%` },
                },
                // 性别
                {
                    teacherSex: { [Op.like]: `%${query}%` },
                },
                // 联系方式
                {
                    phone: { [Op.like]: `%${query}%` },
                },
                // 教学班级
                {
                    className: { [Op.like]: `%${query}%` },
                },
            ],
        }
    } else {
        where = null
    }
    // 查询所有老师信息
    const teachers = await Teacher.findAll({ where });

    // 响应状态码
    ctx.status = 200;

    // 响应 Json 数据
    ctx.body = {
        code: 200,
        data: teachers,
        msg: "查询成功"
    };
})

/* 查询指定 id 的老师 */
router.get('/teachers/:id', async (ctx, next) => {
    // 拿到 请求id
    const id = ctx.params.id;

    // 查询所有老师信息
    const teacher = await Teacher.findByPk(id);

    // 响应状态码
    ctx.status = 200;

    // 响应 Json 数据
    ctx.body = {
        code: 200,
        data: teacher,
        msg: "查询成功"
    };
})

/* 新增老师 */
router.post('/teachers', async (ctx, next) => {
    // 拿到请求对象
    const obj = ctx.request.body;

    // 新增老师
    await Teacher.create(obj);

    // 响应状态码
    ctx.status = 200;

    // 响应 Json 数据
    ctx.body = {
        code: 200,
        data: null,
        msg: "新增成功"
    };
})

/* 修改老师指定 id 的老师 */
router.put('/teachers/:id', async (ctx, next) => {
    // 拿到 请求id
    const id = ctx.params.id;

    // 拿到请求对象
    const obj = ctx.request.body;

    // 老师是否存在
    await Teacher.update(obj, { where: { id } });

    // 响应状态码
    ctx.status = 200;

    // 响应 Json 数据
    ctx.body = {
        code: 200,
        data: null,
        msg: "修改成功"
    };
})

/* 删除指定 id 的老师 */
router.delete('/teachers/:id', async (ctx, next) => {
    // 拿到 请求id
    const id = ctx.params.id;

    // 删除老师
    await Teacher.destroy({ where: { id } });

    // 响应状态码
    ctx.status = 200;

    // 响应 Json 数据
    ctx.body = {
        code: 200,
        data: null,
        msg: "删除成功"
    };
})

/** =========================== */
// 注册路由
app.use(router.routes());

// app 启动端口
const appPort = 8000;

// 监听服务器端口
app.listen(appPort);

// 当前服务器运行地址
console.log(`当前服务器运行地址：http://localhost:${appPort}`);
